package beans;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.persistence.*;
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import rn.UsuarioRN;


@ManagedBean(name="usuario")
@RequestScoped

@Entity
@SequenceGenerator(allocationSize= 1, name = "idgen", sequenceName = "usuario_seq")
@Table(name = "usuario")
public class Usuario implements Serializable {
    
        @Id
        @Column(name="id")
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Integer id;
    
        @Column(name="login",length=20,unique=true)
        private String login;
        
        @Column(name="senha",length=35)
        private String senha;
        
        @Column(name="ativo")
        private Boolean ativo=false;
                
        @Column(name="email",length=65,unique=true)
        private String email;
        
        @Column(name="cpf",length=11,unique=true)
        private String cpf;
        
        @Column(name="nome",length=45)
        private String nome;
        
        @Column(name="data_nascimento")
        @Temporal(javax.persistence.TemporalType.DATE)
        private Date data_nascimento;
               
        @Column(name="data_cadastro")
        @Temporal(javax.persistence.TemporalType.TIMESTAMP)
        private Date data_cadastro = new Date();
        
        @OneToMany(mappedBy="usuario",cascade= CascadeType.REMOVE,fetch= FetchType.LAZY)
        List<UsuarioPermissao> permissoes;
        
        @OneToMany(mappedBy="usuario",cascade= CascadeType.REMOVE,fetch= FetchType.LAZY)
        List<Historico> historicos;
        
        @OneToMany(mappedBy="usuario",cascade= CascadeType.REMOVE,fetch= FetchType.LAZY)
        List<Fatura> faturas;
        
        ////////////////////////////////////////////////////////////////////////
        // para inserir no banco o MD5 use a sequinte query:
        // insert into usuario(id,login,senha,ativo,email)
        // values (1,'teste',MD5('123'),true,'bla@gm');
        // colocar tbm a permissao:
        // insert into usuario_permissao(id,permissao,id_usuario)
        // values (1,'ROLE_ADMIN',1);
        
        public static String MD5(String senha) {
            PasswordEncoder encoder = new Md5PasswordEncoder();
            senha = encoder.encodePassword(senha, null);
            return senha;
        }
        
        public static Usuario capturaLogado() {
            Authentication a = SecurityContextHolder.getContext().getAuthentication();
            User currentUser = (User)a.getPrincipal();
            UsuarioRN rn = new UsuarioRN();
            List<Usuario> user = rn.buscaPersonalizada("login", currentUser.getUsername());
            return user.get(0);
        }
        
        public static String imprimeCPF(String CPF) {
            return(CPF.substring(0, 3) + "." + CPF.substring(3, 6) + "." + CPF.substring(6, 9) + "-" + CPF.substring(9, 11));
        }
              
////////////////////////////////////////////////////////////////////////////////

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = MD5(senha);
    }

    public Boolean getAtivo() {
        return ativo;
    }

    public void setAtivo(Boolean ativo) {
        this.ativo = ativo;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getData_cadastro() {
        return data_cadastro;
    }

    public void setData_cadastro(Date data_cadastro) {
        this.data_cadastro = data_cadastro;
    }

    public List<UsuarioPermissao> getPermissoes() {
        return permissoes;
    }

    public void setPermissoes(List<UsuarioPermissao> permissoes) {
        this.permissoes = permissoes;
    }

    public List<Historico> getHistoricos() {
        return historicos;
    }

    public void setHistoricos(List<Historico> historicos) {
        this.historicos = historicos;
    }

    public List<Fatura> getFaturas() {
        return faturas;
    }

    public void setFaturas(List<Fatura> faturas) {
        this.faturas = faturas;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Date getData_nascimento() {
        return data_nascimento;
    }

    public void setData_nascimento(Date data_nascimento) {
        this.data_nascimento = data_nascimento;
    }

}